拡張版Kコンパイラ(V1.3) ――――――――――――――――――――――――――――――――――――――― FM−8活用研究 掲載 FM−8 拡張Kコンパイラ マシン語 ”RT” $4D00−$4FFF マシン語 ”K”  $2000−$41FF S=$2000 ファイル版拡張Kコンパイラ BASIC ”MP” マシン語  ”RT” $4D00−$4FFF マシン語  ”KF” $2000−$41FF S=$2000 〔例1〕8クイーン ソース(アスキー) ”S1” 〔例2〕高速ソート ソース(アスキー) ”S2” 〔例3〕シェルピンスキー曲線 ソース(アスキー) ”S3” 〔例4〕ランダム・ファイル ソース(アスキー) ”S4” BASIC     ”RF” 起動方法 拡張Kコンパイラ CLEAR10,&H1FFF LOADM””:LOADM”” コンパイル EXEC&H2000 オブジェクト実行 EXEC&H5000 ファイル版拡張Kコンパイラ LOAD RUN コールドスタートの場合C ホット スタートの場合H ――――――――――――――――――――――――――――――――――――――― Kコンパイラは、整数型BASICに次の機能を拡張したものです。 ■英数字ラベルが使える。 ■引数をもったサブルーチン・コールができる。 ■再帰関数コールができる。 ■REPEAT、WHILEが使える。 ■IF−THEN−ELSEが使える。 ■マシン語がそのままプログラム中にかける。 ■配列の割り付けを実アドレスで指定できる。 なお、コンパイル後のオブジェクトは 任意の位置において実行できます(位置自由)。 コンパイラ自身も位置自由です。 ただし、ランタイム・ルーチンは位置固定です。 また、ランタイム・ルーチンの機種に依存する部分は、 1文字入出力と1行入力サブルーチンのみです。 ■■■■■■■■■■■■■■■■■■■ 1. BASICとの相異点 ■■■■■■■■■■■■■■■■■■■ (1)ラベルと文の区切り======== BASlCではGOTO文、GOSUB文 の飛び先を 文番号で指定しますが、 “K”には文番号の概念がなく、ラベルを使用します。 ラベルは英字で始まる英数字列で、 ラベル名のすぐ後にセミコロンを書くことでその場所に定義されます。 ・――――――――――――――――――――――・ |■■■BASIC■■■|■■■■K■■■■■| |―――――――――――+――――――――――| | 10 GOTO 20 | GOTO L20 | | 20 GOSUB 30 | L20; | | 30 RETURN | GOSUB L30 | | | L30; | | | RETURN | ・――――――――――――――――――――――・ 1行に複数の文を書く場合のセパレータが、 BASICではコロン゛:″だが “K”ではセミコロン“;”を使います。 ・――――――――――――――――――――――・ |■■■BASIC■■■|■■■■K■■■■■| |―――――――――――+――――――――――| | 10 A=10:B=20 | A=10;B=20 | ・――――――――――――――――――――――・ (2)REPEAT、WHILE===== 標準的なBASICにはない REPEAT文、WHILE文 が使用できます。 一般形は、   ・――――――――――――――――・ | REPEAT | | 文 | | UNTIL 条件式 |   ・――――――――――――――――・   ・――――――――――――――――・ | WHILE 粂件式 | | 文 | | WEND |   ・――――――――――――――――・ です。 REPEATT文は条件が成立するまで、 WHILE は条件が成立している間、 REPEAT−UNTIL 、 WHILE−WEND で囲まれている文を実行します。 コンパイラはこれらの文をスタックを使わないオブジェクトに展開します。 したがって、REPEAT節、WHILE節 への飛び込み、 飛び出しは自由に行なうことができます。 ・――――――――――――――――――――――・ |■■■K■■■|■■■展開されるコード■■■| |―――――――+――――――――――――――| |REPEAT |L01 EQU * | | I=I+1 | LDD I | |UNTILI>1000 | ADDD #1 | | | STD I ;I=I+1 | | | LDD I | | | SUBD #1000 | | | BLE L01 ; ifI<=1000 | | | then L01 | ・――――――――――――――――――――――・ ・――――――――――――――――――――――・ |■■■K■■■|■■■展開されるコード■■■| |―――――――+――――――――――――――| |WHILE I<=1000 |L01 LDD I | | I=I+1 | SUBD #1000 | |WEND | LBGT L02 | | | LDD I | | | ADDD #1 | | | STD L I | | | BRA L01 | | |L02 EQU * | ・――――――――――――――――――――――・ (3)IF文=================== BASICのIF文は1行という制約がありますが、 KではIF文の有効範囲をFIで明示することにより、 THEN節、ELSE節の複数文化を許しています。 IF文のネストには制限はないが、 1つのIFに対し必らず対応するFIがなくてはなりません。 ・――――――――――――――――――――――・ |■■■BASIC■■■|■■■■K■■■■■| |―――――――――――+――――――――――| |10 IF A>B THEN 40 |IF A<=B THEN | |20 C=B:D=A |C=B;D=A | |30 GOTO 50 |ELSE | |40 C=A:D=B | C=A;D=B | |50 : |FI | |   : |: | ・――――――――――――――――――――――・ (4)GOSUB文================ ・――――――――――――――――――――――・ |GOSUB〈ラベル〉〔引数1,引数2,…,引数n〕    | ・――――――――――――――――――――――・ という形式でサブルーチンに引数を渡せます。 ・――――――――――――――――――――――・ |■■■■■■■■■■K■■■■■■■■■■■| |――――――――――――――――――――――| |〔例〕 GOSUB ALPHA [Z,A,"ABCD"] | |――――――――――――――――――――――| | 〈展開されるコード〉 | | LDD #2 | | PUSH D | | LDD A | | PUSH D | | LEAX SIZE THEN GOSUB PR 280 ' ELSE %N=1 290 ' WHILE %N <=SIZE 300 ' %J=1 310 ' WHILE %J<=%L-1 320 ' IF %N=BOARD(%J) OR %N+%L=BOARD(%J)+%J OR %N-%L=BOARD(%J)-%J THEN 330 ' GOTO L1 340 ' FI 350 ' %J=%J+1 360 ' WEND 370 ' BOARD(%L)=%N 380 ' QUEEN[%L+1,DUMMYN,DUMMYJ] 390 ' L1;%N=%N+1 400 ' WEND 410 ' FI 420 'RETURN 〔例2〕高速ソート 最良のソート法といわれるクイック・ソートと、 小データに対してバブル・ソートを使った高速ソート・プログラムです。 1024個のランダムなデータを、2秒弱でソートします。 手続きQUICK は、QUICK の中でQUICK を呼んでいます。 手続きEXCHANGEは、引数にアドレス値を持ち、 手続きの中でそのアドレスの内容を直接変更しています。 ■■■■■■■■ 高速ソート・プログラム ■■■■■■■■ 100 '(* HIGH SPEED SORTING *) 110 ' DATA=$6000 120 ' PRINT"HOW MANY DATA?";N=INPUT 130 ' FOR I=1 TO N 140 ' (* PRINT"DATA[",I,"]=";DATA(I)=INPUT *) 150 ' DATA(I)=RND(1000) 160 ' NEXT 170 ' PRINT"NOW SORTING..."/ 180 ' QUICK[1,N] 190 ' FOR I=1 TO N 200 ' PRINT"DATA[",I,"]=",DATA(I),/ 210 ' NEXT 220 'END 230 'QUICK; (* QUICK SORT FOR LARGE DATA *) 240 ' IF %2-%1<8 THEN BUBBLE[%1,%2] 250 ' ELSE 260 ' QUMIDDLE=(%1+%2)/2 270 ' QUM=MID[DATA(%1),DATA(QUMIDDLE),DATA(%2)] 280 ' QUF=%1;QUL=%2 290 ' WHILE QUF<=QUL 300 ' WHILE DATA(QUF)QUM;QUL=QUL-1;WEND 320 ' IF QUF<=QUL THEN 330 ' WORK=DATA(QUF);DATA(QUF)=DATA(QUL);DATA(QUL)=WORK 340 ' QUF=QUF+1;QUL=QUL-1 350 ' FI 360 ' WEND 370 ' QUICK[%1,QUL] 380 ' QUICK[QUF,%2] 390 ' FI 400 'RETURN 410 'BUBBLE; (* BUBBLE SORT FOR SMALL DATA *) 420 ' BUBOUND=%1 430 ' WHILE BUBOUND<%2 440 ' BULASTEX=%2-1 450 ' FOR BUI=%2-1 TO BUBOUND STEP -1 460 ' IF DATA(BUI)>DATA(BUI+1) THEN 470 ' WORK=DATA(BUI);DATA(BUI)=DATA(BUI+1);DATA(BUI+1)=WORK 480 ' BULASTEX=BUI 490 ' FI 500 ' NEXT 510 ' BUBOUND=BULASTEX+1 520 ' WEND 530 'RETURN 540 'MID; (* GET MIDDLE VALUE *) 550 ' MIDWRK1=%1;MIDWRK2=%2;MIDWRK3=%3 560 ' IF MIDWRK2>MIDWRK3 THEN EXCHANGE[ADR(MIDWRK2),ADR(MIDWRK3)];FI 570 ' IF MIDWRK1>MIDWRK2 THEN EXCHANGE[ADR(MIDWRK1),ADR(MIDWRK2)];FI 580 ' IF MIDWRK2>MIDWRK3 THEN EXCHANGE[ADR(MIDWRK2),ADR(MIDWRK3)];FI 590 ' MID=MIDWRK2 600 'RETURN 610 'EXCHANGE;(* EXCHANGE DATA *) 620 ' EX1=%1;EX2=%2;EXTEMP=EX1(0);EX1(0)=EX2(0);EX2(0)=EXTEMP 630 'RETURN 〔例3〕シェルピンスキー曲線 シェルピンスキー曲線と呼ばれる、再帰的曲線を描きます。 手続きA、B、C、Dはそれぞれ再帰的な手続きで、 図形の4つの部分を90°ずつ回転して描きます。 最初に、何位まで描くか指定します。 位数により色を変えて描きます。 手続きPLOTは、 FM−8のサブCPUに直接コマンドを与えて、線分を描きます。 位数4のとき,約6秒で全曲線を描きます。 ■■■■■■ シェルピンスキー曲線・プログラム ■■■■■ 100 '(* SHIERPINSKI CURVE PLOT OF ORDER N *) 110 'CONST H0=128 115 'N=INPUT 120 ' H=H0/4;X0=4*H;Y0=3*H 130 ' PRINT CHR$(12);(* CLEAR SCREEN *) 140 ' I=0;COLOR=1 150 'REPEAT; 160 ' I=I+1;X0=X0-H 170 ' H=H/2;Y0=Y0+H 180 ' X=X0;Y=Y0 190 ' XOLD=X*2;YOLD=Y 200 ' A[I];X=X+H;Y=Y-H;PLOT[X*2,Y] 210 ' B[I];X=X-H;Y=Y-H;PLOT[X*2,Y] 220 ' C[I];X=X-H;Y=Y+H;PLOT[X*2,Y] 230 ' D[I];X=X+H;Y=Y+H;PLOT[X*2,Y];COLOR=COLOR+1 240 'UNTIL I=N 250 'END 260 'A;IF %1>0 THEN 270 ' A[%1-1];X=X+H;Y=Y-H;PLOT[X*2,Y] 280 ' B[%1-1];X=X+2*H;PLOT[X*2,Y] 290 ' D[%1-1];X=X+H;Y=Y+H;PLOT[X*2,Y] 300 ' A[%1-1];FI 310 'RETURN 320 'B;IF %1>0 THEN 330 ' B[%1-1];X=X-H;Y=Y-H;PLOT[X*2,Y] 340 ' C[%1-1];Y=Y-2*H;PLOT[X*2,Y] 350 ' A[%1-1];X=X+H;Y=Y-H;PLOT[X*2,Y] 360 ' B[%1-1];FI 370 'RETURN 380 'C;IF %1>0 THEN 390 ' C[%1-1];X=X-H;Y=Y+H;PLOT[X*2,Y] 400 ' D[%1-1];X=X-2*H;PLOT[X*2,Y] 410 ' B[%1-1];X=X-H;Y=Y-H;PLOT[X*2,Y] 420 ' C[%1-1];FI 430 'RETURN 440 'D;IF %1>0 THEN 450 ' D[%1-1];X=X+H;Y=Y+H;PLOT[X*2,Y] 460 ' A[%1-1];Y=Y+2*H;PLOT[X*2,Y] 470 ' C[%1-1];X=X-H;Y=Y+H;PLOT[X*2,Y] 480 ' D[%1-1];FI 490 'RETURN 500 'PLOT; (* PLOT[X,Y] *) 540 ' A=$FC82 551 ' CODE $B6,$FD,$05,$2B,$FB; (* READY ? *) 552 ' POKE $FD05,$80; (* HALT SUB CPU *) 553 ' CODE $B6,$FD,$05,$2A,$FB 560 ' CPOKE A,22,7,0,2,XOLD#,YOLD#,%1#,%2# 570 ' POKE $FC83,COLOR;(* PLOT LINE *) 580 ' POKE $FD05,0; (* RESTART SUB CPU *) 581 ' XOLD=%1;YOLD=%2 590 'RETURN 〔例4〕ランダム・ファイル F−BASICのランダム・ファイルに、 データを数値のまま(文字に変拠せず)入れておきたい場合があります。 このプログラムは、 BASICのメイン・プログラムがランダム・ファイルの入出力を行ない、 Kのサブルーチンがキーボードからの入力と メモリ上のバッファとの入出力を行なう例です。 BASICとKでは、DP(ダイナミック・ページ)レジス夕の値が違うので 注意が必要です。 Kで作成された機械語プログラムの先頭には、 NOP ($12)命令が2個あるので、 それを$34、$7F(PSHS)に変更します。 Kの中でBASICに戻るには、RETURN文でなく、 CODE文により、$35、$FF(PULS)で戻ります。 CLEAR文 によるメモリ上限は、$4B00程度までにしてください。 Kサブ・プログラム 100 'A=$6000 110 'A=A(0) 120 'IF PEEK($6002) THEN GOTO PUT ;FI 130 ' FOR I=0 TO 2;PRINT "DATA",I,"=",A(I),/;NEXT 140 ' FOR I=6 TO 10;PRINT CHR$(A:I));IF A:I)=$0D THEN GOTO RET;FI;NEXT 150 ' GOTO RET 160 'PUT; 170 ' FOR I=0 TO 2;PRINT "DATA",I,"=";A(I)=INPUT;NEXT 180 ' PRINT "NAME=" 190 ' FOR I=6 TO 10;A:I)=GET;PRINT CHR$(A:I));IF A:I)=$0D THEN GOTO RET;FI;NEXT 200 'RET;PRINT /;CODE $35,$FF BASIC メイン・プログラム 100 CLEAR300,&H4B00 110 OPEN"R",#3,"RFILE" 120 FIELD #3,255 AS A$ 130 LSET A$=STRING$(255,&H00) 140 POKE &H5000,&H34:POKE &H5001,&H7F 150 POKE &H6000,PEEK(VARPTR(A$)+1) 160 POKE &H6001,PEEK(VARPTR(A$)+2) 170 INPUT"U(PDATE),R(EAD),E(ND)";ANS$ 180 IF ANS$="E" THEN CLOSE #3:END 190 IF ANS$<>"R" THEN GOTO 250 200 INPUT"RECORD NO.=",RNO 210 IF RNO>LOF(3) THEN PRINT"END OF FILE":GOTO 170 220 GET #3,RNO 230 POKE &H6002,0 240 GOTO 280 250 IF ANS$="U" THEN POKE &H6002,1:GOTO 270 260 PRINT CHR$(7),"COMMAND ERROR":GOTO 170 270 INPUT"RECORD NO.=",RNO 280 EXEC&H5000 290 IF ANS$="U" THEN PUT #3,RNO 300 GOTO 170 【】参考文献 1)I/O、82年1月号マイコン大学 2)K.L.Bowles、“UCSD PASCAL演習”、工学社 3)N.Wirth、“アルゴリズム+データ構造=プログラム”、   日本コンピュータ協会 4)FM−8、ユーザーズマニュアルF−BASIC入門       K−Compiler言語仕様(V1.2) ・―――――――――――――――――――――――――――――――――――――・ |数値|16ビット符号付き2進数 | | | 10進数 -32768〜32767 | | | 16進数 $0000〜$FFFF | | | 1文字定数 'A','B' …… | |――+――――――――――――――――――――――――――――――――――| |変数|単純変数|英字で始まる英数字列で長さは任意だが8文字まで識別する。 | | | |例 LOVELYRUMICHAN | | | | MIURA27 | | |――――+―――――――――――――――――――――――――――――| | |配列 |単純変数の後に(〈式〉または:〈式〉)を付けたもの。 | | | |例 HIZENBERG(DIRAC) | | | | QUARK:COLOR) | | |――――+―――――――――――――――――――――――――――――| | |%変数 |%の後に数値を値いたもの。引数の参照に用いる。 | | | | A=%1 | | | | B=%2 | |――+――――――――――――――――――――――――――――――――――| |関数| ラベル名の後に大カッコで囲った引数を書いたもの。 | | | 例 A=LEN["ABCD"]+3 | |――+――――――――――――――――――――――――――――――――――| |ラベル|単純変数と同じ。                          | ・―――――――――――――――――――――――――――――――――――――・                   関数 ・―――――――――――――――――――――――――――――――――――――・ |■■■一■般■形■■■|■使■用■例■■|■■■■機■■■■■■能■■■■| |―――――――――――+――――――――+――――――――――――――――| |PEEK(〈アドレス〉) |PEEK($1000) |アドレス のメモリ 内を値とする | |―――――――――――+――――――――+――――――――――――――――| |RND(〈式〉) |RND(100) |0〜式の値−1の一様乱数を発生 | | | |0≦RND(n)<n | |―――――――――――+――――――――+――――――――――――――――| |INPUT |        |キーボードより入力する数値を | | | |値とする | |―――――――――――+――――――――+――――――――――――――――| |GET |        |キーが押されるまで待ち、押された | |           | |キーの ASCIIコードを値とする | |―――――――――――+――――――――+――――――――――――――――| |NOT(〈式〉) |NOT(A>1) |論理否定演算 | |―――――――――――+――――――――+――――――――――――――――| |ABS(〈式〉)  |ABS(A+B) |絶対値 | |―――――――――――+――――――――+――――――――――――――――| |-〈式〉 |-100 |負数 | |―――――――――――+――――――――+――――――――――――――――| |LOW(〈式〉〉  | |式の下位バイトを値とする | |―――――――――――+――――――――+――――――――――――――――| |HIGH(〈式〉)  | |式の上位バイトを値とする | |―――――――――――+――――――――+――――――――――――――――| |ADR(変数)  | |変数のアドレスを値とする | |―――――――――――+――――――――+――――――――――――――――| |SGN(〈式〉)  | |式の符号を値とする。 | | | |0は0を値とする。 | |―――――――――――+――――――――+――――――――――――――――| |SEX(〈式〉)  | |1バイトの負の数を       | |           |        |2バイトの負の数にする。    | ・―――――――――――――――――――――――――――――――――――――・                 文 ・―――――――――――――――――――――――――――――――――――――・ |■■■一■般■形■■■|■使■用■例■■|■■■■機■■■■■■能■■■■| |―――――――――――+――――――――+――――――――――――――――| |GOTO〈ラベル〉 |GOTO ALPHA |ラベルにJUMP | |―――――――――――+――――――――+――――――――――――――――| |GOSUB〈ラベル〉 |GOSUB DIRAC |ラベルをサブルーチン・コール | |―――――――――――+――――――――+――――――――――――――――| |RETURN |RETURN |サブルーチンよりリターン | |―――――――――――+――――――――+――――――――――――――――| |REPEAT |REPEAT |条件が成立するまでループ | | | I=I+1 | | | 文  | | | | |UNTIL I>1000 | | |UNTIL〈条件式〉 | | | |―――――――――――+――――――――+――――――――――――――――| |WHILE〈粂件式〉 |WHILE I<1000 |条件が成立している間ループ | | | | | | 文        |I=I+1 | | | | | | |WEND |WEND | | |――――――――――――――――――――+――――――――――――――――| |FOR〈変数〉=〈初期値〉TO〈最終値〉 |繰り返し | | 〔STEP〈きざみ値〉〕 | | | 文 | | | | | |NEXT | | |――――――――――――――――――――+――――――――――――――――| |IF〈条件式〉THEN |IF A=A'THEN |条件が成立していると文1を | | | B='B';C='C' |成立しないときは文2を実行する。| | 文1 |ELSE | | |ELSE | B='D';C='E' | | |         |FI | | | 文2 | | | | | | | |FI | | | |―――――――――――+――――――――+――――――――――――――――| |CALL〈アドレス〉 |CALL $F000 |ユーザーサブルーチン、 | | | |システム・サブルーチンのコール | |―――――――――――+――――――――+――――――――――――――――| |POKE〈アドレス〉,〈値〉 |POKE $200,B+3 |アドレスに値をストア | |―――――――――――+――――――――+――――――――――――――――| |PRINT 出力要素〔,…〕|PRINT"ABC",A |CRTに対するプリント・アウト | |―――――――――――+――――――――+――――――――――――――――| |CODE〈値〉〔,…〕 |CODE$34,$1C,$17 |値を プログラムのこの文の位置に展開| |―――――――――――+――――――――+――――――――――――――――| |CPOKE〈変数〉, |CPOKE A,$34,$08 |Aのアドレスから連続的に | | 〈式〉〔,…〕 | |POKEする。    | |           |        |〈式〉の後に#があると、 | |           |        |2バイトにして書き込む。 | |―――――――――――+――――――――+――――――――――――――――| |DEF〈ラベル〉= |DEF ML=$5000 |ラベルにアドレスを定義する。 | | アドレス〔,〈ラベル〉…〕|CALL ML | | |―――――――――――+――――――――+――――――――――――――――| |CONST〈変数〉= |CONST N=1 |コンパイル時、指定した変数が | | 値〉〔,〈変数〉…〕 | A=%N |現れたら数値に置き換える。 | |―――――――――――+――――――――+――――――――――――――――| |END | |実行を終了する。 | ・―――――――――――――――――――――――――――――――――――――・                 コメント ・―――――――――――――――――――――――――――――――――――――・ |■■■一■般■形■■■|■使■用■例■■|■■■■機■■■■■■能■■■■| |―――――――――――+――――――――+――――――――――――――――| | (* *) | (*REMARK*) | 注 釈 | ・―――――――――――――――――――――――――――――――――――――・            PRINT文中で使用できる関数 ・―――――――――――――――――――――――――――――――――――――・ |■■■一■般■形■■■|■使■用■例■■|■■■■機■■■■■■能■■■■| |―――――――――――+――――――――+――――――――――――――――| |/ | |改行子 | |―――――――――――+――――――――+――――――――――――――――| |CHR$(〈式〉) |CHR$(4) |式の値を ASCIIコードとして出力 | |―――――――――――+――――――――+――――――――――――――――| |HEX$(〈式〉) |HEX$(-121) |式の値を16進4桁で出力 | |―――――――――――+――――――――+――――――――――――――――| |HEX2$(〈式〉) |HEX2$("A") |式の値を16進2桁で出力 | |―――――――――――+――――――――+――――――――――――――――| |SPC$(〈式〉) |SPC$(3) |式の値の数の スペースを出力  | |―――――――――――+――――――――+――――――――――――――――| |"〈文字列〉" |"HITOMI" |""で囲まれた部分を出力 | |―――――――――――+――――――――+――――――――――――――――| |#〈式1〉,〈式2〉 |#4,A |〈式1〉の スペースをとって | |          | |〈式2〉を右づめ出力。 | ・―――――――――――――――――――――――――――――――――――――・                 演算子 ・―――――――――――――――――――――――――――――――――――――・ |■■■一■般■形■■■|■使■用■例■■|■■■■機■■■■■■能■■■■| |―――――――――――+――――――――+――――――――――――――――| | * |X=X2*3 | 乗算演算子 | |―――――――――――+――――――――+――――――――――――――――| | / |X=Y/3 | 除  〃 | |―――――――――――+――――――――+――――――――――――――――| | + |X=X+1 | 加  〃 | |―――――――――――+――――――――+――――――――――――――――| | - |X=X-1 | 減  〃 | |―――――――――――+――――――――+――――――――――――――――| | > |X>1  | 関係演算子 | |―――――――――――+――――――――|                | | >= |X>=1 | | |―――――――――――+――――――――|                | | < |X<1 | | |―――――――――――+――――――――|                | | <= |X<=1 | | |―――――――――――+――――――――|                | | = |X=1 | | |―――――――――――+――――――――|                | | <> |X<>1 | | |―――――――――――+――――――――+――――――――――――――――| | AND |X=1 AND X=2 | 論理演算子 | |−−−−−−−−−−−+−−−−−−−−|                | | OR |X=1 OR X=2 | | ・―――――――――――――――――――――――――――――――――――――・      優先順位は乗除、加減、関係、論理の順